const vscode = require('vscode');
const path = require('path');
const axios = require('axios');

/**
 * @param {vscode.ExtensionContext} context
 */

function getConfig() {
    return {
        "model_type": 1,
        "title": "PSH AI Server",
        "model": "deepseek-coder:6.7b",
        "apiBase": "http://10.96.115.122:11434",
        "apiKey": ""
    };
}

//提取代码块
function extractCode(input) {
    // 使用正则表达式匹配并提取不同类型的代码块
    const codeBlocks = input.match(/```(javascript|python|c)\s*([\s\S]*?)\s*```/g);

    if (!codeBlocks) return ''; // 如果没有匹配到代码块，返回空字符串

    // 移除每个代码块的```language和```标记，并将代码块拼接在一起
    return codeBlocks.map(block => block.replace(/```(javascript|python|c)\s*([\s\S]*?)\s*```/, '$2')).join('\n');
}
// function suffixToLanguage(suffix) {
//     // 定义一个对象，将文件后缀映射到编程语言名称
//     const extensionToLanguage = {
//         'c': 'c',
//         'js': 'javascript',
//         'py': 'python',
//         // 可以根据需要添加更多的映射
//     };
//     // 检查后缀是否存在于映射对象中
//     if (extensionToLanguage.hasOwnProperty(suffix)) {
//         return extensionToLanguage[suffix];
//     }

//     // 如果后缀不在映射中，返回原始后缀
//     return suffix;
// }

function activate(context) {
    let unittest = vscode.commands.registerCommand('code-assistant.unittest', async (uri) => {
        if (uri && uri.fsPath) {
            try {
                // 读取一个文件的内容并将其解码为 UTF-8 编码的字符串。
                const fileContent = await vscode.workspace.fs.readFile(uri);
                const contentString = new TextDecoder('utf-8').decode(fileContent);
                // 配置
                const config = getConfig();
                const fileName = path.basename(uri.fsPath);
                // 文件后缀
                const suffix = fileName.split('.')[1];
                // 提示词
                let prompt = `请为以下代码生成单元测试，以注释的形式说明单元测试需要的框架` + contentString;
                if (suffix == 'js') {
                    prompt += '使用Mocha作为测试框架，Chai作为断言库,生成的js的测试文件使用 ES 模块语法';
                }
                // AI响应
                const response = await axios.post(`${config.apiBase}/api/generate`, {
                    model: config.model,
                    prompt: prompt,
                    stream: false
                });
                // 新的文件名
                const newFileName = fileName.split('.')[0] + '-' + suffix + '.' + suffix;
                // 当前文件所在文件夹路径
                const dirPath = path.dirname(uri.fsPath);
                // 单元测试存放路径
                const newUri = vscode.Uri.file(path.join(dirPath, newFileName));
                // 除去```
                const tempResult = extractCode(response.data.response);
                const result = new TextEncoder().encode(tempResult);
                // 写文件
                await vscode.workspace.fs.writeFile(newUri, result);
            } catch (error) {
                vscode.window.showErrorMessage(`Failed to read file: ${error.message}`);
            }
        } else {
            vscode.window.showInformationMessage('No file selected.');
        }
    });
    //测试去除文件
    let unittest1 = vscode.commands.registerCommand('code-assistant.unittest1', async (uri) => {
        if (uri && uri.fsPath) {
            try {
                // 读取一个文件的内容并将其解码为 UTF-8 编码的字符串。
                const fileContent = await vscode.workspace.fs.readFile(uri);
                const contentString = new TextDecoder('utf-8').decode(fileContent);
                const fileName = path.basename(uri.fsPath);
                // 文件后缀
                const suffix = fileName.split('.')[1];
                // 新的文件名
                const newFileName = fileName.split('.')[0] + '-' + suffix + '.' + suffix;
                // 当前文件所在文件夹路径
                const dirPath = path.dirname(uri.fsPath);
                // 单元测试存放路径
                const newUri = vscode.Uri.file(path.join(dirPath, newFileName));
                // 除去```
                const tempResult = extractCode(contentString);
                const result = new TextEncoder().encode(tempResult);
                // 写文件
                await vscode.workspace.fs.writeFile(newUri, result);
            } catch (error) {
                vscode.window.showErrorMessage(`Failed to read file: ${error.message}`);
            }
        } else {
            vscode.window.showInformationMessage('No file selected.');
        }
    });
    context.subscriptions.push(unittest, unittest1);
}

/**
 * This method is called when your extension is deactivated
 */
function deactivate() {}

module.exports = {
    activate,
    deactivate
}